package com.shujia

object Demo13Match {
  def main(args: Array[String]): Unit = {
    /**
     * 模式匹配：类似Java中的switch
     *
     * Java中的模式匹配可以匹配：
     * 1、基本数据类型
     * 2、字符串
     * 3、枚举
     *
     * Scala中的模式匹配可以匹配：
     * 1、基本数据类型
     * 2、字符串
     * 3、枚举
     * 4、类型
     * 5、样例类对象
     */

    // 1、匹配基本数据类型(匹配基本数据类型的值)
    val int: Int = 130

    // 模式匹配可以有返回值
    val res: Int = int match {
      case 20 =>
        println("int的值为20")
        println("int的值为20")
        println("int的值为20")
        println("int的值为20")
        20
      case 30 =>
        println("int的值为30")
        println("int的值为30")
        println("int的值为30")
        println("int的值为30")
        30
      case _ =>
        println("其他情况")
        -1

    }
    println(res)

    // 2、匹配字符串
    val str: String = "1234"

    val res2: Any = str match {
      case "1234" =>
        1234
      case "2345" =>
        2345
      case _ =>
        "0"
    }
    println(res2)

    // 3、匹配枚举
    val friday: Week.Value = Week.Friday

    friday match {
      // 根据不同情况完成不同事情
      case Week.Friday =>
        println(Week.Friday)
      case Week.Saturday =>
        println(Week.Saturday)
      case _ =>
        println("other")

    }

    // 4、匹配类型
    res2 match {
      case s: String =>
        println(s"res2是String类型,值为：$s")
      case i: Int =>
        println(s"res2是Int类型,值为：$i")

    }

    // 5、匹配样例类对象
    val zs: CaseClz = CaseClz("01", "zs", 20)
    val ls: CaseClz = CaseClz("02", "ls", 22)

    ls match {
      case CaseClz("01", "zs", 20) =>
        println("这是张三")
      case CaseClz("02", "ls", 22) =>
        println("这是李四")
      case _ =>
        println("其他人")
    }

    // 模式匹配在Map集合中的应用
    val map: Map[String, String] = Map("k1" -> "v1", "k2" -> "v2", "k3" -> "v3")
    val maybeString: Option[String] = map.get("k2")
    // 等价于Map方法中的getOrElse
    val getOrElse: String = maybeString match {
      case Some(v) =>
        println(s"有值的情况，key对应的value为：$v")
        v
      case None =>
        println("通过key无法取到值")
        "默认值"
    }
    println(getOrElse)

    /**
     * map方法结合模式匹配可以将复杂结构的元素直接提取里面的值
     */

    val list01: List[(String, (String, (Int, (String, String))))] = List[(String, (String, (Int, (String, String))))](
      ("01", ("zs", (20, ("男", "文科一班"))))
      , ("02", ("ls", (21, ("女", "文科二班"))))
      , ("03", ("ww", (22, ("男", "理科一班"))))
    )

    // 提取List中的id、name、clazz
    list01
      .map(t => {
        val id: String = t._1
        val name: String = t._2._1
        val clazz: String = t._2._2._2._2
        s"$id,$name,$clazz"
      }).foreach(println)

    // 结合模式匹配进行简化
    list01
      .map{
        case (id:String, (name:String, (age:Int, (gender:String, clazz:String)))) =>
          s"$id,$name,$clazz"
      }.foreach(println)


  }

}

// 在Scala中创建枚举
object Week extends Enumeration {
  // 将一周的每一天都枚举出来
  val Monday: Week.Value = Value("Mon")
  val Tuesday: Week.Value = Value("Tues")
  val Wednesday: Week.Value = Value("Wed")
  val Thursday: Week.Value = Value("Thur")
  val Friday: Week.Value = Value("Fri")
  val Saturday: Week.Value = Value("Sat")
  val Sunday: Week.Value = Value("Sun")
}